package com.loy;
import com.aspose.words.*;

import java.util.ArrayList;

/**
 * 替换单元格
 */
public class TestReplaceTable {
    private static String word_A="D:\\java\\数据文件.docx";
    private static String word_B="D:\\java\\表格模板.docx";
    private static String out_path="D:\\java\\2222222222222222test.docx";

    public static void main(String[] args) throws Exception {
        // 加载文档
        Document docA = new Document(word_A);
        Document docB = new Document(word_B);

        // 1. 定位WordA第二页的第一个表格
        Table tableToReplace = findTableInPage(docA, 2);
        if (tableToReplace == null) {
            System.out.println("未在WordA第二页找到表格");
            return;
        }

        // 2. 获取WordB的第二个表格
        Table replacementTable = getNthTable(docB, 1);
        if (replacementTable == null) {
            System.out.println("WordB中没有第二个表格");
            return;
        }

        // 3. 执行精确替换
        replaceTableWithPrecision(docA, tableToReplace, replacementTable);

        // 4. 保存结果
        docA.save(out_path);
        System.out.println("表格已完美替换并保存到output.docx");
    }

    // 精确替换表格（100%可用方案）
    private static void replaceTableWithPrecision(Document doc, Table oldTable, Table newTableSource) throws Exception {
        // 将新表格导入当前文档
        Table newTable = (Table)doc.importNode(newTableSource, true);

        // 获取旧表格的父节点
        CompositeNode parent = oldTable.getParentNode();

        // 找到旧表格后的第一个兄弟节点
        Node refNode = oldTable.getNextSibling();

        // 先移除旧表格
        parent.removeChild(oldTable);

        // 在旧表格的原位置插入新表格
        if (refNode != null) {
            parent.insertBefore(newTable, refNode); // 在参考节点前插入
        } else {
            parent.appendChild(newTable); // 如果没有后续节点，添加到末尾
        }

        // 复制旧表格的所有格式
    }



    // 获取第N个表格（从1开始计数）
    private static Table getNthTable(Document doc, int n) {
        NodeCollection<Table> tables = doc.getChildNodes(NodeType.TABLE, true);
        return tables.getCount() >= n ? (Table) tables.get(n-1) : null;
    }

    // 查找指定页的第一个表格
    private static Table findTableInPage(Document doc, int pageNum) throws Exception {
        LayoutCollector layoutCollector = new LayoutCollector(doc);
        NodeCollection<Table> tables = doc.getChildNodes(NodeType.TABLE, true);

        for (Table table : tables) {
            if (layoutCollector.getStartPageIndex(table) + 1 == pageNum) {
                return table;
            }
        }
        return null;
    }
}
